package com.automotive.can1939.ui.adapter;

import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.automotive.can1939.R;
import com.automotive.can1939.can.CanDataParser;
import com.automotive.can1939.can.J1939DataParser;
import com.automotive.can1939.can.CanTestDataGenerator;
import com.automotive.can1939.model.CanFrame;
import com.automotive.can1939.model.J1939Frame;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;

/**
 * CAN帧数据适配器
 */
public class CanFrameAdapter extends RecyclerView.Adapter<CanFrameAdapter.CanFrameViewHolder> {
    
    private List<CanFrame> frameList;
    private SimpleDateFormat timeFormat;
    
    public CanFrameAdapter(List<CanFrame> frameList) {
        this.frameList = frameList;
        this.timeFormat = new SimpleDateFormat("HH:mm:ss.SSS", Locale.getDefault());
    }
    
    @NonNull
    @Override
    public CanFrameViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_can_frame, parent, false);
        return new CanFrameViewHolder(view);
    }
    
    @Override
    public void onBindViewHolder(@NonNull CanFrameViewHolder holder, int position) {
        CanFrame frame = frameList.get(position);
        
        // 检查是否为J1939帧
        boolean isJ1939 = frame.isExtended() && isJ1939Frame(frame);
        
        if (isJ1939) {
            // 显示J1939帧信息
            J1939Frame j1939Frame = new J1939Frame(frame.getCanId(), frame.getData());
            holder.bindJ1939(j1939Frame);
        } else {
            // 显示标准CAN帧信息
            holder.bind(frame);
        }
    }
    
    @Override
    public int getItemCount() {
        return frameList.size();
    }
    
    /**
     * 检查是否为J1939帧
     */
    private boolean isJ1939Frame(CanFrame frame) {
        if (!frame.isExtended()) {
            return false;
        }
        
        // 提取PGN（参数组号）
        int canId = frame.getCanId();
        int pgn = (canId >> 8) & 0x3FFFF; // 提取PGN部分
        
        // 检查是否在J1939 PGN有效范围内
        return pgn >= 0x00F000 && pgn <= 0x00FFFF || // 标准PGN范围
               pgn >= 0x00EF00 && pgn <= 0x00EFFF;   // 专有PGN范围
    }
    
    /**
     * ViewHolder类
     */
    public class CanFrameViewHolder extends RecyclerView.ViewHolder {
        
        private TextView tvTimestamp;
        private TextView tvCanId;
        private TextView tvDataHex;
        private TextView tvParsedData;
        private TextView tvDescription;
        private View indicatorView;
        
        public CanFrameViewHolder(@NonNull View itemView) {
            super(itemView);
            
            tvTimestamp = itemView.findViewById(R.id.tv_timestamp);
            tvCanId = itemView.findViewById(R.id.tv_can_id);
            tvDataHex = itemView.findViewById(R.id.tv_data_hex);
            tvParsedData = itemView.findViewById(R.id.tv_parsed_data);
            tvDescription = itemView.findViewById(R.id.tv_description);
            indicatorView = itemView.findViewById(R.id.indicator_view);
        }
        
        public void bind(CanFrame frame) {
            // 时间戳
            String timestamp = timeFormat.format(new Date(frame.getTimestamp()));
            tvTimestamp.setText(timestamp);
            
            // CAN ID
            String canIdText = String.format("ID: 0x%X", frame.getCanId());
            if (frame.isExtended()) {
                canIdText += " (扩展帧)";
            }
            tvCanId.setText(canIdText);
            
            // 原始数据
            String hexData = frame.getDataHexString();
            tvDataHex.setText("数据: " + hexData);
            
            // 解析后的数据
            CanDataParser.ParseResult parseResult = CanDataParser.parseFrame(frame);
            tvParsedData.setText(parseResult.getSignalName() + ": " + 
                    parseResult.getValue() + " " + parseResult.getUnit());
            
            // 描述信息
            String description = CanTestDataGenerator.getCanIdDescription(frame.getCanId());
            tvDescription.setText(description);
            
            // 设置指示器颜色（根据CAN ID类型）
            setIndicatorColor(frame.getCanId());
            
            // 设置点击事件
            itemView.setOnClickListener(v -> {
                // 可以在这里添加详细信息显示
                showFrameDetails(frame, parseResult);
            });
        }
        
        /**
         * 绑定J1939帧数据
         */
        public void bindJ1939(J1939Frame j1939Frame) {
            CanFrame frame = j1939Frame.toCanFrame();
            
            // 时间戳
            String timestamp = timeFormat.format(new Date(frame.getTimestamp()));
            tvTimestamp.setText(timestamp);
            
            // CAN ID和PGN信息
            String canIdText = String.format("ID: 0x%X (PGN: 0x%X)", frame.getCanId(), j1939Frame.getPgn());
            tvCanId.setText(canIdText);
            
            // 原始数据
            String hexData = frame.getDataHexString();
            tvDataHex.setText("数据: " + hexData);
            
            // 解析后的J1939数据
            J1939DataParser.J1939ParseResult j1939Result = J1939DataParser.parseFrame(j1939Frame);
            tvParsedData.setText(j1939Result.getSpnName() + ": " + 
                    j1939Result.getValue() + " " + j1939Result.getUnit());
            
            // J1939描述信息
            String description = String.format("%s (SA: 0x%02X, P: %d)", 
                    j1939Result.getPgnName(), j1939Frame.getSourceAddress(), j1939Frame.getPriority());
            tvDescription.setText(description);
            
            // 设置J1939指示器颜色（根据PGN类型）
            setJ1939IndicatorColor(j1939Frame.getPgn());
            
            // 设置点击事件
            itemView.setOnClickListener(v -> {
                showJ1939FrameDetails(j1939Frame, j1939Result);
            });
        }
        
        /**
         * 根据CAN ID设置指示器颜色
         */
        private void setIndicatorColor(int canId) {
            int color;
            
            if (canId >= 0x0C0 && canId <= 0x0CF) {
                // 发动机相关 - 红色
                color = Color.parseColor("#F44336");
            } else if (canId >= 0x1A0 && canId <= 0x1AF) {
                // 车速相关 - 蓝色
                color = Color.parseColor("#2196F3");
            } else if (canId >= 0x2A0 && canId <= 0x2AF) {
                // 制动系统 - 橙色
                color = Color.parseColor("#FF9800");
            } else if (canId >= 0x3A0 && canId <= 0x3AF) {
                // 空调系统 - 青色
                color = Color.parseColor("#00BCD4");
            } else if (canId >= 0x4A0 && canId <= 0x4AF) {
                // 照明系统 - 黄色
                color = Color.parseColor("#FFEB3B");
            } else if (canId >= 0x5A0 && canId <= 0x5AF) {
                // 车门车窗 - 绿色
                color = Color.parseColor("#4CAF50");
            } else {
                // 其他 - 灰色
                color = Color.parseColor("#9E9E9E");
            }
            
            indicatorView.setBackgroundColor(color);
        }
        
        /**
         * 根据J1939 PGN设置指示器颜色
         */
        private void setJ1939IndicatorColor(int pgn) {
            int color;
            
            if (pgn >= 0x00F000 && pgn <= 0x00F00F) {
                // 发动机控制器 - 深红色
                color = Color.parseColor("#D32F2F");
            } else if (pgn >= 0x00FEE0 && pgn <= 0x00FEEF) {
                // 发动机温度 - 橙红色
                color = Color.parseColor("#FF5722");
            } else if (pgn >= 0x00FEF0 && pgn <= 0x00FEF9) {
                // 车辆动态 - 深蓝色
                color = Color.parseColor("#1976D2");
            } else if (pgn >= 0x00F001 && pgn <= 0x00F009) {
                // 制动/传动控制 - 深紫色
                color = Color.parseColor("#7B1FA2");
            } else if (pgn >= 0x00FEC0 && pgn <= 0x00FECF) {
                // 车辆信息 - 深绿色
                color = Color.parseColor("#388E3C");
            } else if (pgn >= 0x00EF00 && pgn <= 0x00EFFF) {
                // 专有PGN - 深灰色
                color = Color.parseColor("#424242");
            } else {
                // J1939默认 - 靛蓝色
                color = Color.parseColor("#3F51B5");
            }
            
            indicatorView.setBackgroundColor(color);
        }
        
        /**
         * 显示帧详细信息
         */
        private void showFrameDetails(CanFrame frame, CanDataParser.ParseResult parseResult) {
            // 这里可以显示一个对话框或跳转到详情页面
            // 暂时使用Toast显示
            String details = String.format(
                    "详细信息:\n" +
                    "CAN ID: 0x%X\n" +
                    "数据长度: %d 字节\n" +
                    "原始数据: %s\n" +
                    "解析结果: %s\n" +
                    "描述: %s\n" +
                    "时间戳: %s",
                    frame.getCanId(),
                    frame.getDataLength(),
                    frame.getDataHexString(),
                    parseResult.toString(),
                    parseResult.getDescription(),
                    timeFormat.format(new Date(frame.getTimestamp()))
            );
            
            // 可以在这里添加详情对话框
            // 暂时留空，后续可以扩展
        }
        
        /**
         * 显示J1939帧详细信息
         */
        private void showJ1939FrameDetails(J1939Frame j1939Frame, J1939DataParser.J1939ParseResult parseResult) {
            // J1939帧详细信息
            String details = String.format(
                    "J1939详细信息:\n" +
                    "CAN ID: 0x%X\n" +
                    "PGN: 0x%X (%s)\n" +
                    "SPN: %d (%s)\n" +
                    "优先级: %d\n" +
                    "源地址: 0x%02X\n" +
                    "数据长度: %d 字节\n" +
                    "原始数据: %s\n" +
                    "解析值: %s %s\n" +
                    "描述: %s\n" +
                    "时间戳: %s",
                    j1939Frame.getCanId(),
                    j1939Frame.getPgn(),
                    parseResult.getPgnName(),
                    parseResult.getSpn(),
                    parseResult.getSpnName(),
                    j1939Frame.getPriority(),
                    j1939Frame.getSourceAddress(),
                    j1939Frame.getData().length,
                    j1939Frame.getDataHexString(),
                    parseResult.getValue(),
                    parseResult.getUnit(),
                    parseResult.getDescription(),
                    timeFormat.format(new Date(j1939Frame.getTimestamp()))
            );
            
            // 可以在这里添加J1939详情对话框
            // 暂时留空，后续可以扩展
        }
    }
    
    /**
     * 更新数据
     */
    public void updateData(List<CanFrame> newFrameList) {
        this.frameList = newFrameList;
        notifyDataSetChanged();
    }
    
    /**
     * 添加新帧
     */
    public void addFrame(CanFrame frame) {
        frameList.add(0, frame);
        notifyItemInserted(0);
    }
    
    /**
     * 清空数据
     */
    public void clearData() {
        frameList.clear();
        notifyDataSetChanged();
    }
}